<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 在 D 天内送达包裹的能力 -->
    <script>
      var shipWithinDays = function (weights, days) {
        let n = weights.length
        //先确定左右边界
        //由于题目不允许拆分包裹，所以left 只能按照包裹最大值计算
        //由于最快就是1天运载完成，所以是weights的总和
        let left = Math.max(...weights)
        let right = weights.reduce((a, b) => a + b)
        while (left < right) {
          let acc = 0 //记录单日运载量
          let cost_day = 1 //需要运载的天数
          //置初始值为1的原因:
          //如果最后一趟剩下的包裹重量和达不到 > mid的情况
          //就不会执行cost_day++的操作，但这样就相当最后剩下的包裹都丢弃了
          let mid = Math.floor(left + (right - left) / 2) //mid向下取整
          for (let i = 0; i < n; i++) {
            //if中的条件要注意，如果acc和当前指向的weights[i]和
            //会大于mid的话 说明达到单次运载能力 执行清零和天数加1的操作
            if (acc + weights[i] > mid) {
              cost_day++
              acc = 0
            }
            acc += weights[i]
          }
          //这个地方cost_day <= days也要注意
          //if中的条件说明，运载速度太快，相当于是nums[mid] > target 了
          if (cost_day <= days) {
            right = mid
            //要求最低运载能力，所以===不能直接返回，要继续缩小左边界
          } else {
            left = mid + 1
          }
        }
        return left
        //while退出条件是left===right 所以返回left或者right都可以
      }
      console.log(shipWithinDays([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 5))
    </script>
  </body>
</html>
